package com.oig.sys.security.config;

import com.oig.sys.security.support.PermissionVerifyService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;


/**
 * 有EnableGlobalMethodSecurity 就算没有加EnableOauthResourceServer也会被装配，为了query服务不警告，直接放这里，实例化了这两个类也没有关系
 *
 * 说明：
 * 三种方法级别权限控制注解 ，这里只需要表达式的。
 * 一 JSR-250注解
 *   依赖 jsr250-api
 *   在权限控制的方法上面使用注解 @RolesAllowed("ADMIN")
 *   这种也可以写@RolesAllowed("ROLE_ADMIN")，上面是省略ROLE_前缀
 * 二 @Secured注解
 *   在权限控制的方法上面使用注解 @Secured("ROLE_ADMIN") 这里不能省略ROLE_前缀
 * 三 基于表达式操作
 *   在权限控制的方法上面使用注解 @PreAuthorize("authentication.principal.username == 'xx'")
 *   注解  @PreAuthorize("hasRole('ROLE_ADMIN')") 这里可以省略ROLE_前缀；  @PreAuthorize("hasRole('ADMIN')")
 */
@EnableGlobalMethodSecurity(prePostEnabled=true)
@Slf4j
public class SecurityAutoConfig {

    /**
     * 自定义PreAuthorize 匹配规则
     */
    @Bean(name = "pms")
    public PermissionVerifyService permissionVerifyService(){
        log.debug("PermissionVerifyService Bean register...");
        return new PermissionVerifyService();
    }

    @Bean
    public ResourceAuthExceptionEntryPoint resourceAuthExceptionEntryPoint(){
        log.debug("ResourceAuthExceptionEntryPoint Bean register...");
        return new ResourceAuthExceptionEntryPoint();
    }


    @Bean
    public ResourceAccessDeniedHandler resourceAccessDeniedHandler(){
        log.debug("ResourceAccessDeniedHandler Bean register...");
        return new ResourceAccessDeniedHandler();
    }

}
